function clone1(target){
  // 类型判断
  if(typeof target === 'object' && target !== null){
    // 判断数据是否为数组
    if(Array.isArray(target)){
      return [...target]
    }else{
      return {...target}
    }
  }else{
    return target
  }
}

function clone2(target){
  // 类型判断
  if(typeof target === 'object' && target !== null){
    const result = Array.isArray(target) ? [] : {};
    for(let key in target){
      // 判断当前对象身上是否包含改属性
      if(target.hasOwnProperty(key)){
        result[key] = target[key]
      }
    }
  }else{
    return target
  }
}


function deepClone1(target){
  //通过数据创建 JSON 格式的字符串
  let str = JSON.stringify(target)
  //将 JSON字符串创建为 JS数据
  let data = JSON.parse(str)
  return data
}

function deepClone2(target){
  // 检测数据的类型
  if(typeof target === 'object' && target !== null){
    //创建一个容器
    const result = Array.isArray(target) ? [] : {};
    for(let key in target){
      // 判断当前对象身上是否包含改属性
      if(target.hasOwnProperty(key)){
        result[key] = deepClone2(target[key])
      }
    }
    return result
  }else{
    return target
  }
}

function deepClone3(target,map=new Map()){
  // 检测数据的类型
  if(typeof target === 'object' && target !== null){
    //克隆之前，进行判断，数据之前是否克隆过
    let cache = map.get(target)
    if(cache){
      return cache
    }
    //创建一个容器
    const result = Array.isArray(target) ? [] : {};
    //将新的结构存入到容器中
    map.set(target,result)
    for(let key in target){
      // 判断当前对象身上是否包含改属性
      if(target.hasOwnProperty(key)){
        result[key] = deepClone3(target[key],map)
      }
    }
    return result
  }else{
    return target
  }
}


function deepClone4(target,map=new Map()){
  // 检测数据的类型
  if(typeof target === 'object' && target !== null){
    //克隆之前，进行判断，数据之前是否克隆过
    let cache = map.get(target)
    if(cache){
      return cache
    }
    let isArray = Array.isArray(target)
    const result = isArray ? [] : {};
    //将新的结构存入到容器中
    map.set(target,result)
    if(isArray){
      target.forEach((item,index)=>{
        result[index] = deepClone4(item,map)
      })
    }else{
      Object.keys(target).forEach(key=>{
        result[key] = deepClone4(target[key],map)
      })
    }

    return result
  }else{
    return target
  }
}


